// https://leetcode.cn/problems/max-consecutive-ones-iii/

// 题干：给定一个二进制数组 nums 和一个整数 k，如果可以翻转最多 k 个 0 ，则返回 数组中连续 1 的最大个数 。

// 示例：输入：nums = [1,1,1,0,0,0,1,1,1,1,0], K = 2
//       输出：6

// 碎语：right指针持续往右走，直到出现的0的次数大于k，此时已经不能往右走
//       只能left指针向右走，此时由于已经用zeroCounts记录，且right指针往回走，则一定不是最长的长度，也无必要
//       判断条件，是否zeroCounts++来入窗，循环判断zeroCounts是否大于k，若大于，则left指针自加，直到0的数量小于k
//       此时出循环后一定是合法区间，更新结果。

#include <bits/stdc++.h>
using namespace std;

class Solution
{
public:
    int longestOnes(vector<int>& nums, int k)
    {
        int left = 0, right = 0;
        int ret = 0, zeroCounts = 0;

        while (right < nums.size()){
            if (nums[right] == 0) zeroCounts++;

            while (zeroCounts > k){
                if (nums[left] == 0) zeroCounts--;
                left++;
            }
            ret = max(ret, right - left + 1);
            right++;
        }

        return ret;
    }
};

int main()
{
    Solution sol;
    vector<int> nums = {1,1,1,0,0,0,1,1,1,1,0};

    cout << sol.longestOnes(nums, 2) << endl;

    return 0;
}